#!/bin/bash

set -e  # 任一命令失败则停止

rust_dir=/opt/rust
rustup_dir="$rust_dir/.rustup"
cargo_dir="$rust_dir/.cargo"
group=rustup

# === 检查sudo权限 ===
check_sudo() {
    echo "🔑 检查sudo权限..."
    if ! sudo -v; then
        echo "❌ 无法获取sudo权限，请确保你的用户有sudo权限"
        exit 1
    fi
    # 保持sudo权限活跃
    trap 'sudo -k' EXIT
}

# === 检查组和用户组成员资格 ===
group_exists() {
    getent group "$group" > /dev/null 2>&1
}

user_in_group() {
    groups | grep -qw "$group"
}

# === 选择镜像源 ===
select_mirror() {
    echo ""
    echo "🌍 选择下载镜像源（推荐使用国内镜像加速）:"
    echo "1) RsProxy (rustcc) - https://rsproxy.cn (推荐，专门优化)"
    echo "2) 中科大镜像 - https://mirrors.ustc.edu.cn"
    echo "3) 清华镜像 - https://mirrors.tuna.tsinghua.edu.cn (可能受限)"
    echo "4) 官方源 (可能较慢) - https://sh.rustup.rs"
    read -p "请选择 [1/2/3/4] (默认1): " mirror_choice
    
    case $mirror_choice in
        2) 
            export RUSTUP_DIST_SERVER="https://mirrors.ustc.edu.cn/rust-static"
            export RUSTUP_UPDATE_ROOT="https://mirrors.ustc.edu.cn/rustup/rustup"
            mirror_url="https://mirrors.ustc.edu.cn/rust-static/rustup/rustup-init.sh"
            echo "🔧 使用中科大镜像源"
            ;;
        3)
            export RUSTUP_DIST_SERVER="https://mirrors.tuna.tsinghua.edu.cn/rustup"
            export RUSTUP_UPDATE_ROOT="https://mirrors.tuna.tsinghua.edu.cn/rustup/rustup"
            mirror_url="https://mirrors.tuna.tsinghua.edu.cn/rustup/rustup-init.sh"
            echo "🔧 使用清华镜像源（注意：可能有下载限制）"
            ;;
        4)
            unset RUSTUP_DIST_SERVER
            unset RUSTUP_UPDATE_ROOT
            mirror_url="https://sh.rustup.rs"
            echo "🔧 使用官方源（可能较慢）"
            ;;
        *)
            export RUSTUP_DIST_SERVER="https://rsproxy.cn"
            export RUSTUP_UPDATE_ROOT="https://rsproxy.cn/rustup"
            mirror_url="https://rsproxy.cn/rustup-init.sh"
            echo "🔧 使用RsProxy镜像源（推荐）"
            ;;
    esac
    
    # 设置安装目录环境变量
    export RUSTUP_HOME="$rustup_dir"
    export CARGO_HOME="$cargo_dir"
}

# === 带进度的下载函数 ===
download_with_progress() {
    local url=$1
    local output=$2
    
    echo "⬇️  正在下载 rustup-init 脚本..."
    echo "   源地址: $url"
    
    if command -v curl >/dev/null 2>&1; then
        curl --proto '=https' --tlsv1.2 -L -# "$url" -o "$output"
    elif command -v wget >/dev/null 2>&1; then
        wget -O "$output" "$url"
    else
        echo "❌ 未找到 curl 或 wget，请安装其中一个"
        exit 1
    fi
    
    if [ $? -ne 0 ]; then
        echo "❌ 下载失败，请检查网络连接"
        echo "💡 建议尝试其他镜像源，特别是 RsProxy (选项1)"
        exit 1
    fi
    
    # 检查下载的文件是否是HTML（说明被重定向到错误页面）
    if grep -q '<html' "$output" || grep -q '<!DOCTYPE' "$output"; then
        echo "❌ 下载的文件是HTML页面，不是真正的安装脚本"
        echo "💡 这通常是因为镜像源限制了下载，请尝试其他镜像源"
        rm -f "$output"
        exit 1
    fi
    
    chmod +x "$output"
    echo "✅ 下载完成"
}

# === 主逻辑 ===
check_sudo  # 首先检查sudo权限

if group_exists && user_in_group; then
    echo "✅ 用户 $USER 已属于组 '$group'，继续安装 rustup..."
    
    # 选择镜像源并设置环境变量
    select_mirror
    
    # 下载安装脚本
    download_with_progress "$mirror_url" "$HOME/rustup-init.sh"
    
    # 创建目录结构
    echo "📁 创建目录结构..."
    sudo mkdir -p "$rust_dir"
    sudo chown "root:$group" "$rust_dir"
    sudo chmod 775 "$rust_dir"
    sudo chmod g+s "$rust_dir"  # setgid，确保新文件继承组
    
    # 设置PATH以便找到rustup
    export PATH="$PATH:$cargo_dir/bin"
    
    # 安装 rustup - 使用环境变量方式指定目录
    echo "⚙️  安装 rustup..."
    echo "   目标目录: $rust_dir"
    echo "   RUSTUP_HOME: $RUSTUP_HOME"
    echo "   CARGO_HOME: $CARGO_HOME"
    echo "   配置: 无默认toolchain，最小化安装"
    
    # 使用环境变量方式，不再使用 --rustup-dir 和 --cargo-dir 参数
    "$HOME/rustup-init.sh" -y \
        --no-modify-path \
        --profile minimal \
        --default-toolchain none -v
    
    # 清理
    rm -f "$HOME/rustup-init.sh"
    
    echo ""
    echo "✅ rustup 已成功安装到 $rust_dir"
    echo ""
    echo "🔧 下一步配置:"
    echo "1. 将以下内容添加到你的 ~/.bashrc 或 ~/.zshrc:"
    echo "   export PATH=\"\$PATH:$cargo_dir/bin\""
    echo "   export RUSTUP_HOME=\"$rustup_dir\""
    echo "   export CARGO_HOME=\"$cargo_dir\""
    echo ""
    echo "2. 然后运行: source ~/.bashrc  (或 source ~/.zshrc)"
    echo ""
    echo "3. 验证安装: rustup --version"
    echo ""
    echo "4. 配置 crates.io 镜像源（强烈推荐）:"
    echo "   mkdir -p $cargo_dir/config"
    echo "   cat > $cargo_dir/config/config.toml <<EOF"
    echo "[source.crates-io]"
    echo "replace-with = 'rsproxy-sparse'"
    echo "[source.rsproxy]"
    echo "registry = \"https://rsproxy.cn/crates.io-index\""
    echo "[source.rsproxy-sparse]"
    echo "registry = \"sparse+https://rsproxy.cn/index/\""
    echo "[registries.rsproxy]"
    echo "index = \"https://rsproxy.cn/crates.io-index\""
    echo "[registries.rsproxy-sparse]"
    echo "index = \"sparse+https://rsproxy.cn/index/\""
    echo "[net]"
    echo "git-fetch-with-cli = true"
    echo "EOF"
    echo ""
    echo "5. 应用配置: source ~/.bashrc"
    echo "6. 测试安装: rustc --version"
    
else
    echo "ℹ️ 检测到组 '$group' 未配置或用户 '$USER' 不在组中。"
    
    # 创建组（如果不存在）
    if ! group_exists; then
        echo "🔧 创建组 '$group'..."
        sudo groupadd -f "$group"
    fi

    # 添加用户到组（如果不在）
    if ! user_in_group; then
        echo "🔧 将用户 '$USER' 添加到组 '$group'..."
        sudo usermod -aG "$group" "$USER"
    fi

    echo ""
    echo "⚠️  注意：Linux 组权限变更需要重新登录才能生效！"
    echo "➡️  请执行以下操作："
    echo "    1. 退出当前终端会话"
    echo "    2.  重新登录"
    echo "    3. 再次运行此脚本完成安装"
    exit 1
fi
